#ifndef CASE_H
#define CASE_H

#include <QList>
#include <QString>
#include <vector>
#include "Polygone.h"
#include "entite.h"
#include "joueur.h"

using namespace std;

class Case{

private:
    QString type;												/* Type de la case (montagne, plaine, marais...) */
	QList<Case*> voisins;										/* Liste des cases voisines */
	bool bord;													/* Booléen qui indique si la case est une case de bord de plateau (initialisé dans la recherche de voisinage) */
	Polygone pol;												/* Contours de la case */
	int nbPions;												/* Nombre de pions présents sur la case */
	Entite* ent;												/* Pointeur vers l'entité qui contrôle la case */
	Joueur* jou;												/* Pointeur vers le joueur qui contrôle la case */
	
public:
    Case();														/* Constructeur par défaut de la classe */
	Case( Case* &_c );											/* Constructeur de copie */
	
    QString			getType();									/* Accesseur de la classe */
    Polygone		getPol();									/* Accesseur de la classe */
	QList<Case*>	getVoisins();								/* Accesseur de la classe */
	bool			getBord();									/* Accesseur de la classe */
	int				getNbPions();								/* Accesseur de la classe */
	Entite*			getEnt();									/* Accesseur de la classe */
	Joueur*			getJoueur();								/* Accesseur de la classe */
	
	void			setBord( bool _b );							/* Modificateur de la classe */
	void			setType(QString _type);						/* Modificateur de la classe */
	void			setNbPions(int _i);							/* Modificateur de la classe */
	void			setEnt ( Entite* _e );						/* Modificateur de la classe */
	void			setJoueur ( Joueur* _j );					/* Modificateur de la classe */
	
	Case			operator=(const Case &_c);					/* Operateur d'affectation */
	
	bool isEmpty();												/* Renvoie true si la case est vide (elle n'a plus de points dans son polygone) */
	int getNbPts();												/* Renvoie le nombre de points de la case */
	Point* getPoint ( int _i );									/* Renvoie le _i eme point de la case */
	
	void addPoint(Point* _p);
	void deleteLastPoint();										/* Supprime le dernier point de la case */
	void deletePoint(Point* _p);								/* Supprime le point _p s'il fait partie de la case */
	void replacePoint (Point* _p1, Point* _p2);					/* Remplace _p1 par _p2 dans la case si _p1 en fait partie */
	
	void addNeighbour ( Case* _c );								/* Ajoute la case _c à la liste des voisins de la case */
	void initNeighbourhood( vector<Case*> _cases );				/* Rempli la liste de cases voisines (vide l'ancienne liste) */
	bool isBord( vector<Case*> _cases );						/* Renvoie true si la case est une case de bord, false sinon */
	int getNbVoisins();											/* Renvoie le nombre de cases voisines de celle-ci */
	
	void clear();												/* Reinitialise tous les attributs d'une case à 0/NULL/PLAINE */
	
	bool contains( Point* _p );									/* Renvoie true si le point (_x, _y) se trouve à l'interieur du polygone de la case, false sinon */
	bool contains(int _x, int _y);								/* Renvoie true si le point (_x, _y) se trouve à l'interieur du polygone de la case, false sinon */
	
	void print();
	void display();												/* Affiche les contours de la case sous forme de lignes */
	void display(float _r, float _g, float _b );				/* Affiche les contours de la case sous forme de lignes de couleur */
	void displayFilled(float _r, float _g, float _b);			/* Affiche les contours de la case sous forme d'un polygone plein de couleur */
	void displayFilled(float _r, float _g, float _b,float _a);	/* Affiche les contours de la case sous forme d'un polygone plein de couleur en transparence */
	void displayNeighbourhood(float _r, float _g, float _b);	/* Affiche le voisinnage de la case en couleur */
	void displayType();											/* Affiche le type de la case à la position du barycentre de celle ci */
	void displayNbPions();										/* Affiche le nombre de pions de la case une ligne sous la position de son barycentre */
	
	/* Version de test de displayPions il faudra l'automatiser ( ne plus passer une image en argument ) */
	void displayPions( Image _i );								/* Affiche les pions sur la case */
};

#endif // CASE_H
